home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
001-010
/
amok03
/
intuistruct1.3
/
intuistruct.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
12KB
|
526 lines
(**********************************************************************
:Program. IntuiStruct.mod
:Contents. Easy initializing of Intuition structures
:CoFiles. amok#3/IntuiStruct1.3/IntuiStruct.doc
:Author. Nicolas Benezan [bne]
:Address. Postwiesenstr. 2, D7000 Stuttgart 60
:Phone. 711/333679
:Copyright. Public Domain
:Language. Modula-2
:Translator. M2Amiga AMSoft
:ModHistory. V1.0a [bne] 23.05.88 (first PD-version, Amok#2)
:ModHistory. V1.1b [bne] 13.06.88 (extended MemHandler)
:ModHistory. V1.2d [bne] 05.07.88 (+ StructRequest, StructBorder)
:ModHistory. V1.3b [bne] 11.07.88 (+ UnlinkMenu, FreeImage)
**********************************************************************)
IMPLEMENTATION MODULE IntuiStruct;
FROM Intuition IMPORT NewScreen,ScreenFlagSet,NewWindow,IDCMPFlagSet,
WindowFlagSet,ScreenPtr,stdScreenHeight,Image,ImagePtr,
IntuiText,IntuiTextPtr,Gadget,GadgetPtr,GadgetFlagSet,
GadgetFlags,ActivationFlagSet,PropInfo,PropInfoFlagSet,
StringInfo,Menu,MenuPtr,MenuItem,MenuItemPtr,Point,
MenuItemFlagSet,MenuItemFlags,menuEnabled,WindowPtr,
RefreshGadgets,RequesterPtr,Requester,BorderPtr,Border,
RequesterFlagSet;
FROM Graphics IMPORT ViewModeSet,ViewModes,DrawModeSet,jam1;
FROM SYSTEM IMPORT ADR,ADDRESS,BITSET,LONGSET,WORD,CAST;
FROM Exec IMPORT Byte,UByte;
FROM Arts IMPORT Assert;
CONST CorruptImage ="IntuiStruct: Image Struct corrupt";
CorruptMenu ="IntuiStruct: Menu Struct corrupt";
CorruptBorder ="IntuiStruct: Border Struct corrupt";
AllocError ="IntuiStruct: No AllocProc installed";
DeallocError ="IntuiStruct: No DealcProc installed";
TYPE WordPtr=POINTER TO CARDINAL;
VAR CurImagePtr:WordPtr;
CurBorderPtr:POINTER TO Point;
ImageSize,BorderSize,Count:INTEGER;
SubItemPtr,ItemPtr:MenuItemPtr;
MenuOK:BOOLEAN;
PROCEDURE FailAlloc(VAR PadA:ADDRESS;PadL:LONGINT;PadB:BOOLEAN);
BEGIN
Assert(FALSE,ADR(AllocError));
END FailAlloc;
PROCEDURE FailDealloc(VAR PadA:ADDRESS);
BEGIN
Assert(FALSE,ADR(DeallocError));
END FailDealloc;
PROCEDURE StructScreen(VAR NewSc:NewScreen;Depth,Detail,Block:Byte;
Mode:ViewModeSet;Type:ScreenFlagSet;Title:ADDRESS);
BEGIN
WITH NewSc DO
leftEdge:=0;
topEdge:=0;
IF hires IN Mode THEN
width:=640;
ELSE
width:=320;
END;
height:=stdScreenHeight;
depth:=Depth;
detailPen:=CAST(UByte,Detail);
blockPen:=CAST(UByte,Block);
viewModes:=Mode;
type:=Type;
font:=NIL;
defaultTitle:=Title;
gadgets:=NIL;
customBitMap:=NIL;
END;
END StructScreen;
PROCEDURE StructWindow(VAR NewW:NewWindow;Left,Top,Width,Height:INTEGER;
Detail,Block:Byte;IDCMP:IDCMPFlagSet;Flags:WindowFlagSet;
Title:ADDRESS;Screen:ScreenPtr;Type:ScreenFlagSet);
BEGIN
WITH NewW DO
leftEdge:=Left;
topEdge:=Top;
width:=Width;
height:=Height;
detailPen:=CAST(UByte,Detail);
blockPen:=CAST(UByte,Block);
idcmpFlags:=IDCMP;
flags:=Flags;
firstGadget:=NIL;
checkMark:=NIL;
title:=Title;
screen:=Screen;
bitMap:=NIL;
type:=Type;
minWidth:=0;
minHeight:=0;
maxWidth:=0;
maxHeight:=0;
END;
END StructWindow;
PROCEDURE StructImage(VAR NewImage:Image;Left,Top,Width,Height,Depth:
INTEGER;Pick,OnOff:BITSET;Next:ImagePtr);
BEGIN
Assert((ImageSize=0)AND(BorderSize=0),ADR(CorruptImage));
WITH NewImage DO
leftEdge:=Left;
topEdge:=Top;
width:=Width;
height:=Height;
depth:=Depth;
IF Depth#0 THEN
ImageSize:=2*depth*height*((width-1)DIV 16 +1);
AllocProc(imageData,ImageSize,CHIP);
END;
planePick:=CAST(CARDINAL,Pick);
planeOnOff:=CAST(CARDINAL,OnOff);
nextImage:=Next;
END;
Count:=0;
CurImagePtr:=NewImage.imageData;
END StructImage;
PROCEDURE Word(Data:CARDINAL);
BEGIN
Assert((CurImagePtr#NIL)AND(Count<ImageSize-1),ADR(CorruptImage));
CurImagePtr^:=Data;
INC(CurImagePtr,2);
INC(Count,2);
END Word;
PROCEDURE Long(Data:LONGCARD);
BEGIN
Word(Data DIV 10000H);
Word(Data MOD 10000H);
END Long;
PROCEDURE ImageEnd;
BEGIN
Assert(Count=ImageSize,ADR(CorruptImage));
ImageSize:=0;
Count:=-1;
CurImagePtr:=NIL;
END ImageEnd;
PROCEDURE FreeImage(VAR Img:Image);
BEGIN
WITH Img DO
IF imageData#NIL THEN
DeallocProc(Img.imageData);
END;
depth:=0;
IF nextImage#NIL THEN
FreeImage(nextImage^);
END;
END;
END FreeImage;
PROCEDURE StructText(VAR IText:IntuiText;APen,BPen:Byte;Mode:DrawModeSet;
Left,Top:INTEGER;Text:ADDRESS;Next:IntuiTextPtr);
BEGIN
WITH IText DO
frontPen:=CAST(UByte,APen);
backPen:=CAST(UByte,BPen);
drawMode:=Mode;
leftEdge:=Left;
topEdge:=Top;
iTextFont:=NIL;
iText:=Text;
nextText:=Next;
END;
END StructText;
PROCEDURE StructGadget(VAR NewGadg:Gadget;Left,Top,Width,Height:INTEGER;
Flags:GadgetFlagSet;Activ:ActivationFlagSet;Type:CARDINAL;
Render:ADDRESS;Text:IntuiTextPtr;Excl:LONGSET;ID:INTEGER;
Next:GadgetPtr);
BEGIN
WITH NewGadg DO
nextGadget:=Next;
leftEdge:=Left;
topEdge:=Top;
width:=Width;
height:=Height;
flags:=Flags;
activation:=Activ;
gadgetType:=Type;
gadgetRender:=Render;
selectRender:=NIL;
gadgetText:=Text;
mutualExclude:=Excl;
specialInfo:=NIL;
gadgetID:=ID;
userData:=NIL;
END;
END StructGadget;
PROCEDURE ExcludeGadget(Gadgets:GadgetPtr;Window:WindowPtr;
Requester:RequesterPtr;Mask:LONGSET);
VAR TempPtr:GadgetPtr;
Bit:INTEGER;
BEGIN
Bit:=0;
WHILE (Gadgets#NIL)AND(Bit<32) DO
IF (Bit IN Mask)AND(selected IN Gadgets^.flags) THEN
WITH Gadgets^ DO
flags:=flags-GadgetFlagSet{selected};
TempPtr:=nextGadget;
nextGadget:=NIL;
RefreshGadgets(Gadgets,Window,Requester);
nextGadget:=TempPtr;
END;
END;
Gadgets:=Gadgets^.nextGadget;
INC(Bit);
END;
END ExcludeGadget;
PROCEDURE StructProp(VAR Info:PropInfo;Flags:PropInfoFlagSet;
HPot,VPot,HBody,VBody:CARDINAL);
BEGIN
WITH Info DO
flags:=Flags;
horizPot:=HPot;
vertPot:=VPot;
horizBody:=HBody;
vertBody:=VBody;
END;
END StructProp;
PROCEDURE StructString(VAR Info:StringInfo;VAR Buffer,UndoBuf:
ARRAY OF CHAR);
BEGIN
WITH Info DO
buffer:=ADR(Buffer);
undoBuffer:=ADR(UndoBuf);
bufferPos:=0;
maxChars:=HIGH(Buffer);
dispPos:=0;
END;
Assert(HIGH(UndoBuf)>=Info.maxChars,
ADR("StringGadget: UndoBuf too small"));
END StructString;
PROCEDURE LinkItems(ItemPtr:MenuItemPtr);
VAR TopEdge:INTEGER;
BEGIN
TopEdge:=0;
WHILE ItemPtr#NIL DO
WITH ItemPtr^ DO
topEdge:=TopEdge;
IF subItem#NIL THEN
LinkItems(subItem);
END;
END;
INC(TopEdge,StdHeight);
ItemPtr:=ItemPtr^.nextItem;
END;
END LinkItems;
PROCEDURE LinkMenu(VAR MenuStrip:MenuPtr;Name:ADDRESS;Pos,Width:
INTEGER;Enabled:BOOLEAN):BOOLEAN;
VAR TempPtr:MenuPtr;
BEGIN
IF MenuOK THEN
Assert(SubItemPtr=NIL,ADR(CorruptMenu));
AllocProc(TempPtr,SIZE(Menu),CHIPorFAST);
IF TempPtr#NIL THEN
TempPtr^.nextMenu:=MenuStrip;
MenuStrip:=TempPtr;
WITH MenuStrip^ DO
leftEdge:=Pos;
topEdge:=0;
width:=Width;
height:=StdHeight;
IF Enabled THEN
flags:={menuEnabled};
ELSE
flags:={};
END;
menuName:=Name;
firstItem:=ItemPtr;
LinkItems(ItemPtr);
END;
ItemPtr:=NIL;
RETURN TRUE;
END;
END;
ItemPtr:=NIL;
MenuOK:=TRUE;
RETURN FALSE;
END LinkMenu;
PROCEDURE InitItem(VAR ItemPtr:MenuItemPtr):BOOLEAN;
VAR TempPtr:MenuItemPtr;
BEGIN
AllocProc(TempPtr,SIZE(MenuItem),CHIPorFAST);
IF TempPtr#NIL THEN
AllocProc(TempPtr^.itemFill,SIZE(IntuiText),CHIPorFAST);
IF TempPtr^.itemFill#NIL THEN
TempPtr^.nextItem:=ItemPtr;
ItemPtr:=TempPtr;
RETURN TRUE;
ELSE
DeallocProc(TempPtr);
END;
END;
MenuOK:=FALSE;
RETURN FALSE;
END InitItem;
PROCEDURE InitText(VAR TextPtr:IntuiTextPtr;Text:ADDRESS;Flags:
MenuItemFlagSet);
BEGIN
WITH TextPtr^ DO
frontPen:=0;
drawMode:=jam1;
IF checkIt IN Flags THEN
leftEdge:=CheckWidth;
ELSE
leftEdge:=0;
END;
topEdge:=1;
iTextFont:=NIL;
iText:=Text;
END;
END InitText;
PROCEDURE Item(Name:ADDRESS;Width:INTEGER;Flags:MenuItemFlagSet;
Excl:LONGSET;Cmd:CHAR);
BEGIN
IF InitItem(ItemPtr) THEN
WITH ItemPtr^ DO
leftEdge:=0;
width:=Width;
IF checkIt IN Flags THEN
INC(width,CheckWidth);
END;
height:=StdHeight;
flags:=Flags;
mutualExclude:=Excl;
command:=Cmd;
subItem:=SubItemPtr;
InitText(CAST(IntuiTextPtr,itemFill),Name,Flags);
END;
END;
SubItemPtr:=NIL;
END Item;
PROCEDURE SubItem(Name:ADDRESS;LeftEdge,Width:INTEGER;Flags:
MenuItemFlagSet;Excl:LONGSET;Cmd:CHAR);
BEGIN
IF InitItem(SubItemPtr) THEN
WITH SubItemPtr^ DO
leftEdge:=LeftEdge;
width:=Width;
IF checkIt IN Flags THEN
INC(width,CheckWidth);
END;
height:=StdHeight;
flags:=Flags;
mutualExclude:=Excl;
command:=Cmd;
subItem:=NIL;
InitText(CAST(IntuiTextPtr,itemFill),Name,Flags);
END;
END;
END SubItem;
PROCEDURE UnlinkMenu(VAR MenuStrip:MenuPtr);
PROCEDURE FreeItems(Item:MenuItemPtr);
BEGIN
WITH Item^ DO
IF nextItem#NIL THEN
FreeItems(nextItem);
END;
IF subItem#NIL THEN
FreeItems(subItem);
END;
END;
DeallocProc(Item);
END FreeItems;
BEGIN
IF MenuStrip#NIL THEN
WITH MenuStrip^ DO
IF nextMenu#NIL THEN
UnlinkMenu(nextMenu);
END;
FreeItems(firstItem);
END;
DeallocProc(MenuStrip);
MenuStrip:=NIL;
END;
END UnlinkMenu;
PROCEDURE MenuNum(Num:CARDINAL):CARDINAL;
BEGIN
RETURN Num MOD 0020H;
END MenuNum;
PROCEDURE ItemNum(Num:CARDINAL):CARDINAL;
BEGIN
RETURN Num DIV 0020H MOD 0040H;
END ItemNum;
PROCEDURE SubNum(Num:CARDINAL):CARDINAL;
BEGIN
RETURN Num DIV 0800H;
END SubNum;
PROCEDURE MakeNum(Menu,Item,SubItem:CARDINAL):CARDINAL;
BEGIN
RETURN (Menu MOD 20H)+(Item MOD 40H)*0020H+(SubItem MOD 20H)*800H;
END MakeNum;
PROCEDURE StructRequest(VAR Req:Requester;Left,Top,Width,Height:INTEGER;
Gadgets:GadgetPtr;ReqBorder:BorderPtr;Text:IntuiTextPtr;
BPen:Byte);
BEGIN
WITH Req DO
leftEdge:=Left;
topEdge:=Top;
width:=Width;
height:=Height;
reqGadget:=Gadgets;
reqBorder:=ReqBorder;
reqText:=Text;
flags:=RequesterFlagSet{};
backFill:=BPen;
END;
END StructRequest;
PROCEDURE AddLine(X,Y:INTEGER);
BEGIN
Assert((CurBorderPtr#NIL)AND(Count<BorderSize),ADR(CorruptBorder));
WITH CurBorderPtr^ DO
x:=X;
y:=Y;
END;
INC(Count);
INC(CurBorderPtr,SIZE(Point));
END AddLine;
PROCEDURE StructBorder(VAR Bord:Border;Left,Top:INTEGER;Pen:Byte;
Mode:DrawModeSet;NumLines:UByte;Next:BorderPtr);
BEGIN
Assert((ImageSize=0)AND(BorderSize=0),ADR(CorruptBorder));
INC(NumLines);
WITH Bord DO
leftEdge:=Left;
topEdge:=Top;
frontPen:=CAST(UByte,Pen);
backPen:=0;
drawMode:=Mode;
nextBorder:=Next;
AllocProc(xy,SIZE(Point)*NumLines,CHIPorFAST);
Count:=0;
IF xy=NIL THEN
count:=0;
BorderSize:=0;
CurBorderPtr:=NIL;
ELSE
count:=NumLines;
BorderSize:=count;
CurBorderPtr:=xy;
AddLine(0,0);
END;
END;
END StructBorder;
PROCEDURE Rectangle(Width,Height:INTEGER);
BEGIN
Assert((CurBorderPtr#NIL)AND(BorderSize=5)AND(Count=1),
ADR(CorruptBorder));
DEC(Width);
DEC(Height);
AddLine(Width,0);
AddLine(Width,Height);
AddLine(0,Height);
AddLine(0,0);
END Rectangle;
PROCEDURE BorderEnd;
BEGIN
Assert(Count=BorderSize,ADR(CorruptBorder));
BorderSize:=0;
Count:=-1;
CurBorderPtr:=NIL;
END BorderEnd;
PROCEDURE FreeBorder(VAR Bord:Border);
BEGIN
WITH Bord DO
IF xy#NIL THEN
DeallocProc(xy);
END;
count:=0;
IF nextBorder#NIL THEN
FreeBorder(nextBorder^);
END;
END;
END FreeBorder;
BEGIN
CurImagePtr:=NIL;
CurBorderPtr:=NIL;
ItemPtr:=NIL;
SubItemPtr:=NIL;
ImageSize:=0;
BorderSize:=0;
Count:=-1;
CommWidth:=48;
CheckWidth:=24;
StdHeight:=10;
MenuOK:=TRUE;
AllocProc:=FailAlloc;
DeallocProc:=FailDealloc;
END IntuiStruct.